package com.cyc.single;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

/**
 * 枚举 jdk5  本身也是一个Class类
 */
public enum EnumString {
    INSTANCE;

    public EnumString getInstance(){
        return INSTANCE;
    }
}

class test{
    public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        EnumString instance1 = EnumString.INSTANCE;
//        EnumString instance2 = EnumString.INSTANCE;
//        System.out.println(instance1==instance2);//true
        //通过.class文件 能看到 枚举有无参构造方法  尝试可以通过反射获取
        // 但是报错java.lang.NoSuchMethodException: com.cyc.single.EnumString.<init>() 没有空参方法
        //使用jad 将原先的class反编译成java源文件 才发现是一个有参构造方法 (String,int) 所有更改构造器
        // 最终得到结果 java.lang.IllegalArgumentException: Cannot reflectively create enum objects 说明反射不能创建枚举对象
//        Constructor<EnumString> declaredConstructor = EnumString.class.getDeclaredConstructor(null);
        Constructor<EnumString> declaredConstructor = EnumString.class.getDeclaredConstructor(String.class,int.class);
        declaredConstructor.setAccessible(true);
        EnumString enumString = declaredConstructor.newInstance();
        System.out.println(instance1==enumString);
    }
}
